#include "logger.h"
#include <algorithm>

logger_t debug_logger;

//////////////////////////////////////////////////////////////////////////
//
logger_t::logger_t()
{
	lock_section(ct);
	log_streams.push_back( std::wcout );
}

//////////////////////////////////////////////////////////////////////////
//
logger_t::~logger_t()
{

}

//////////////////////////////////////////////////////////////////////////
//
logger_t& logger_t::operator<<( stream_t& (*pf)(stream_t&) )
{
	lock_section(ct);

	for(size_t i=0; i<log_streams.size(); ++i)
	{
		log_streams[i].get() << pf;
	}

	return *this;
}

//////////////////////////////////////////////////////////////////////////
//
void logger_t::add_stream( stream_t& stream )
{
	lock_section(ct);

	auto i = find(stream);

	if(i == log_streams.end())
		log_streams.push_back(stream);
}

//////////////////////////////////////////////////////////////////////////
//
void logger_t::erase_stream( stream_t& stream )
{
	lock_section(ct);

	auto i = find(stream);

	if(i != log_streams.end())
		log_streams.erase(i);
}

//////////////////////////////////////////////////////////////////////////
//
logger_t::log_streams_t::iterator logger_t::find( stream_t& stream )
{
	lock_section(ct);

	for(auto i=log_streams.begin(); i != log_streams.end();)
	{
		if( &i->get() == &stream )
		{
			return i;
		}
	}

	return log_streams.end();
}

//////////////////////////////////////////////////////////////////////////
//

namespace log_tag
{
	wchar_t const * error = L"[ERROR]";
	wchar_t const * warning = L"[WARNING]";
	wchar_t const * debug = L"[DEBUG]";
	wchar_t const * info = L"[INFO]";
	wchar_t const * verbose = L"[VERBOSE]";
}

//////////////////////////////////////////////////////////////////////////